package com.bpm.example.event.signal;

import com.bpm.common.util.FlowableEngineUtil;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.junit.Test;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 信号启动事件
 * 信号事件是一种`全局事件`，可以在任何流程实例或任务实例中触发和捕获,也可以通过api触发，也可以通过发送信号启动流程实例
 * @author curleyg
 * @version 1.0
 * @date 2020/8/31 16:06
 */
@Slf4j
public class RunSignalStartEventProcessDemo extends FlowableEngineUtil {

    /**
     * 方式一：作为普通的开始事件启动流程
     */
    @Test
    public void runTimerStartEventProcessDemo() {
        //加载Flowable配置文件并初始化流程引擎及服务
        initFlowableEngineAndServices("flowable.job.xml");
        //部署流程
        ProcessDefinition procDef
                = deployResource("processes/signal/SignalStartEventProcess.bpmn20.xml");
        //直接启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId());
        //获取第一个任务
        TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(processInstance.getId());

        Task task = taskQuery.singleResult();

        //获取任务处理人 和 任务名称
        log.info("当前流程到达的用户任务的处理人为:{}",task.getAssignee());
        log.info("当前流程到达的用户任务名称为:{}",task.getName());
        taskService.complete(task.getId());
    }

    /**
     * 方式二使用api调用
     */
    @Test
    public void runTimerStartEventProcessDemo2() {
        //加载Flowable配置文件并初始化流程引擎及服务
        initFlowableEngineAndServices("flowable.job.xml");
        //部署流程
        ProcessDefinition procDef
                = deployResource("processes/SignalStartEventProcess.bpmn20.xml");
        //通过调用api抛出信号
        runtimeService.signalEventReceived("signal");
        //获取第一个任务
        TaskQuery taskQuery = taskService.createTaskQuery().processDefinitionId(procDef.getId());

        Task task = taskQuery.singleResult();

        //获取任务处理人 和 任务名称
        log.info("当前流程到达的用户任务的处理人为:{}",task.getAssignee());
        log.info("当前流程到达的用户任务名称为:{}",task.getName());
        taskService.complete(task.getId());
    }

}
